package main

import (
	"strconv"
	"strings"
)

// 394. 字符串解码
func main() {
	str := "3[a]2[bc]"
	s := decodeString(str)
	println(s)
}

func decodeString(s string) string {
	var stack []string
	// 字母正常入栈, 数字入栈，[ 开始入栈字符,
	ptr := 0
	for ptr < len(s) {
		cur := s[ptr]
		if '0' <= cur && cur <= '9' { // 如果是数字，获取数字
			num := GetNums(s, &ptr)
			stack = append(stack, num)
		} else if string(s[ptr]) == "]" { // 开始往回找
			str := ""
			for stack[len(stack)-1] != "[" {
				str = stack[len(stack)-1] + str
				stack = stack[:len(stack)-1]
			}
			stack = stack[:len(stack)-1] // 去掉"["
			repeatNum := stack[len(stack)-1]
			stack = stack[:len(stack)-1] // 去掉数字
			atoi, _ := strconv.Atoi(repeatNum)
			for i := 0; i < atoi; i++ {
				stack = append(stack, str)
			}
			ptr++
		} else {
			stack = append(stack, string(cur))
			ptr++
		}
	}
	return strings.Join(stack, "")
}

func GetNums(s string, ptr *int) string {
	numStr := ""
	for ; '0' <= s[*ptr] && s[*ptr] <= '9'; *ptr++ {
		numStr += string(s[*ptr])
	}
	return numStr
}

func GetString(s []string) string {
	str := ""
	for i := range s {
		str += s[i]
	}
	return str
}

// 394. 字符串解码
//给定一个经过编码的字符串，返回它解码后的字符串。
//
//编码规则为: k[encoded_string]，表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
//
//你可以认为输入字符串总是有效的；输入字符串中没有额外的空格，且输入的方括号总是符合格式要求的。
//
//此外，你可以认为原始数据不包含数字，所有的数字只表示重复的次数 k ，例如不会出现像 3a 或 2[4] 的输入。
//
//
//
//示例 1：
//
//输入：s = "3[a]2[bc]"
//输出："aaabcbc"
//示例 2：
//
//输入：s = "3[a2[c]]"
//输出："accaccacc"
//示例 3：
//
//输入：s = "2[abc]3[cd]ef"
//输出："abcabccdcdcdef"
//示例 4：
//
//输入：s = "abc3[cd]xyz"
//输出："abccdcdcdxyz"
//
//
//提示：
//
//1 <= s.length <= 30
//s 由小写英文字母、数字和方括号 '[]' 组成
//s 保证是一个 有效 的输入。
//s 中所有整数的取值范围为 [1, 300]
